/******************************************************************************
 * Copyright (c) 2016, Texas Instruments Incorporated - http://www.ti.com/
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *      * Redistributions of source code must retain the above copyright
 *        notice, this list of conditions and the following disclaimer.
 *      * Redistributions in binary form must reproduce the above copyright
 *        notice, this list of conditions and the following disclaimer in the
 *        documentation and/or other materials provided with the distribution.
 *      * Neither the name of Texas Instruments Incorporated nor the
 *        names of its contributors may be used to endorse or promote products
 *        derived from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 *  THE POSSIBILITY OF SUCH DAMAGE.
 *****************************************************************************/

#pragma once

namespace tiocl {

// Kinds of error messages reported by the OpenCL runtime.
// Refer tiocl::ErrorStrings for the corresponding error messages
enum class ErrorKind
{
    PageSizeNotAvailable = 0,
    RegionAddressNotMultipleOfPageSize,
    RegionSizeNotMultipleOfPageSize,
    FailedToOpenFileName,
    TranslateAddressOutsideMappedAddressRange,
    UnableToMapDSPAddress,
    IllegalMemoryRegion,
    CMEMInitFailed,
    CMEMMinBlocks,
    CMEMInvalidBlockId,
    CMEMMapFailed,
    CMEMAllocFailed,
    CMEMAllocFromBlockFailed,
    IonOpenFailed,
    IonCloseFailed,
    IonAllocFailed,
    IonFreeFailed,
    IonCacheOpFailed,
    IonPtrNotAlloced,
    InvalidPointerToClFree,
    InvalidPointerToFree,
    ELFLibraryInitFailed,
    ELFBeginFailed,
    ELFSymbolAddressNotCached,
    DeviceResetFailed,
    DeviceLoadFailed,
    DeviceRunFailed,
    NumComputeUnitDetectionFailed,
    DSPMonitorPathNonExistent,
    TiOclInstallNotSpecified,
    MailboxCreationFailed,
    ShouldNotGetHere,
    PCIeDriverError,
    MessageQueueCountMismatch,
    FailedToOpenEVEMessageQ,
    LostDSP,
    DaemonNotRunning,
    DaemonAlreadyRunning,
    DaemonConfigOpenError,
    KernelArgSizeZero,
    KernelArgSizeTooBig,
    KernelArgSizesMaxExceeded,
    KernelArgImageNotSupported,
    TempMemAllocationFailed,
    InfoMessage,
    InfoMessage2,
};

// Types of error messages, used to control behavior of ReportError
enum class ErrorType { Warning, Fatal, FatalNoExit, Abort };

// Report an error to the user. Calls exit for ErrorType::Fatal
void ReportError(const ErrorType et, const ErrorKind ek, ...);


// Trace mechanism for debugging, disabled by default.
// Zero overhead when disabled.
//#define TRACE_ENABLED
#if defined(TRACE_ENABLED)
void ReportTrace(const char *fmt, ...);
#else
#define ReportTrace(...)
#endif

extern const char* command_code_string[];
}



